/**
  * @file Segment.h
  * @author Thibault Merle et Guillaume Poussel
  */
#ifndef SEGMENT_H
#define SEGMENT_H

#include <iostream>
#include "base/Point.h"
#include "base/Segment.h"

/**
  * Cette classe représente un segment entre deux points
  */
class Segment {

private:
    /// Début du segment
    const Point* _pt1;
    /// Fin du segment
    const Point* _pt2;
public:
    Segment(const Point* pt1, const Point* pt2) : _pt1(pt1), _pt2(pt2) {};
    const Point* pt1() const { return _pt1; };
    const Point* pt2() const { return _pt2; };

    p_type x() const { return _pt2->x()-_pt1->x(); };
    p_type y() const { return _pt2->y()-_pt1->y(); };

    /**
      * Détermine si ce segment contient un point donné
      * @param pt Point à tester
      * @return \p true si le point est sur le segment, \p false sinon.
      */
    bool contains(const Point* pt) const;

    /**
      * Détermine si ce segment intersecte le rayon horizontal
      * droit issu d'un point.
      * @param pt Point duquel est issu le rayon horizontal droit
      * @return \p true si le segment et le rayon s'intersectent, \p false sinon.
      */
    bool intersects_radius(const Point* pt) const;

    /**
      * Détermine si ce segment intersecte un autre segment
      * @param segment Autre segment
      * @return \p true si les deux segments s'intersectent, \p false sinon.
      */
    bool intersect_segment(const Segment* segment) const;
    friend std::ostream& operator<<(std::ostream&, const Segment&);

};


#endif
